//
// Created by 权观宇 on 2021/9/17.
//
// 《GB/T 33481-2016》 OES
//

#ifndef GOES_OES_H
#define GOES_OES_H

/**
 * 8.1.1 函数返回值
 */
#define OES_OK                      0x00000000 // 调用成功
#define OES_CANCEL                  0x00000010 // 使用者取消
/*
 * 0x00000000 ~ 0x00001111 预留使用
 *
 * 错误码不得占用，上述范围内的数值
 */

/**
 * 8.1.2 印章图像常量
 */
#define OES_SEALIMAGE_FLAG_DISPLAY 0x00000000 // 用于显示
#define OES_SEALIMAGE_FLAG_PRINT   0x00000001 // 用于打印
#define OES_SEALIMAGE_FLAG_PREVIEW 0x00000002 // 用于打印预览


/**
 * 8.1.3 接口参数约定
 *
 * 接口函数调用中有多个返还值的，在函数中使用字节数组合数组长度结合的方式定义，
 * 并标注[out]或[out|in]字样。当传入字节数组为空（NULL）时，由函数的实现者
 * 确定字节数组所需长度并通过数组长度返回，由函数调用者申请对应长度的空数组后
 * 再次调用获取返还值。
 */


/**
 * 返回签章组件提供者信息
 *
 * @param puchName      [out]    名称（UTF-8编码）
 * @param piNameLen     [in,out] 名称长度
 * @param puchCompany   [out]    公司名称（UTF-8编码）
 * @param piCompanyLen  [in,out] 公司名称长度
 * @param puchVersion   [out]    版本（UTF-8编码）
 * @param piVersionLen  [in,out] 版本长度
 * @param puchExtend    [out]    扩展信息（UTF-8编码）
 * @param piExtendLen   [in,out] 扩展信息长度
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetProviderInfo(unsigned char *puchName, int *piNameLen,
                        unsigned char *puchCompany, int *piCompanyLen,
                        unsigned char *puchVersion, int *piVersionLen,
                        unsigned char *puchExtend, int *piExtendLen);

/**
 * 获取电子印章列表，该函数用于进行印章名称到标识的转换
 *
 * @param puchSealListData  [out]     印章列表数据（UTF-8编码）
 * @param piSealListDataLen [in,out]  印章列表数据长度
 * @return  调用成功返回 OES_OK，否则是错误码。
 */
int OSE_GetSealList(unsigned char *puchSealListData, int *piSealListDataLen);

/**
 * 获取指定标识的电子印章数据
 *
 * @param puchSealId    [in]     印章标识或名称（字符串）
 * @param iSealIdLen    [in]     印章标识或名称长度
 * @param puchSealData  [out]    印章数据
 * @param piSealDataLen [in,out] 印章数据长度
 * @return  调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetSeal(unsigned char *puchSealId, int iSealIdLen,
                unsigned char *puchSealData, int *piSealDataLen);

/**
 * 获取电子印章信息
 *
 * @param puchData          [in]     印章数据
 * @param iDataLen          [in]     印章数据长度
 * @param puchSealId        [out]    头信息-印章标识
 * @param iSealIdLen        [in,out] 头信息-印章标识长度
 * @param puchVersion       [out]    头信息-版本
 * @param iVersionLen       [in,out] 头信息-版本标识长度
 * @param puchVenderId      [out]    头信息-厂商标标识
 * @param iVenderIdLen      [in,out] 头信息-厂商标标识长度
 * @param puchSealType      [out]    印章信息-印章类型
 * @param iSealTypeLen      [in,out] 印章信息-印章类型长度
 * @param puchSealName      [out]    印章信息-印章名称
 * @param iSealNameLen      [in,out] 印章信息-印章名称长度
 * @param puchCertInfo      [out]    印章信息-证书列表信息
 * @param iCertInfoLen      [in,out] 印章信息-证书列表信息长度
 * @param puchValidStart    [out]    印章信息-有效起始时间
 * @param iValidStartLen    [in,out] 印章信息-有效起始时间长度
 * @param puchValidEnd      [out]    印章信息-有效结束时间
 * @param iValidEndLen      [in,out] 印章信息-有效结束时间长度
 * @param puchSignedData    [out]    印章信息-制做日期
 * @param iSignedDataLen    [in,out] 印章信息-制做日期长度
 * @param puchSignerName    [out]    签名信息-制章人
 * @param iSignerNameLen    [in,out] 签名信息-制章人长度
 * @param puchSignMethod    [out]    签名信息-制章签名方法
 * @param iSignMethodLen    [in,out] 签名信息-制章签名方法长度
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetSealInfo(unsigned char *puchData, int iDataLen,
                    unsigned char *puchSealId, int *iSealIdLen,
                    unsigned char *puchVersion, int *iVersionLen,
                    unsigned char *puchVenderId, int *iVenderIdLen,
                    unsigned char *puchSealType, int *iSealTypeLen,
                    unsigned char *puchSealName, int *iSealNameLen,
                    unsigned char *puchCertInfo, int *iCertInfoLen,
                    unsigned char *puchValidStart, int *iValidStartLen,
                    unsigned char *puchValidEnd, int *iValidEndLen,
                    unsigned char *puchSignedDate, int *iSignedDateLen,
                    unsigned char *puchSignerName, int *iSignerNameLen,
                    unsigned char *puchSignMethod, int *iSignMethodLen);

/**
 * 获取电子印章图像，该接口应在不插入只能密码钥匙时可用。
 *
 * @param puchSealData      [in]     印章数据
 * @param iSealDataLen      [in]     印章数据长度
 * @param iRenderFlag       [in]     绘制用途标记
 * @param puchSealImage     [out]    印章图像数据
 * @param piSealnImageLen   [in,out] 印章图像数据长度
 * @param piSealWidth       [in,out] 印章宽度（单位 mm）
 * @param piSealHeight      [in,out] 印章高度（单位 mm）
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetSealImage(unsigned char *puchSealData, int iSealDataLen,
                     int iRenderFlag, unsigned char *puchSealImage, int *piSealnImageLen,
                     int *piSealWidth, int *piSealHeight);

/**
 * 获取签名时间（时间戳或明文格式）
 *
 * @param puchSignDateTime  [out]    签名时间（字符时用UTF-8编码；时间戳时二进制值）
 * @param piSignDateTimeLen [in,out] 时间戳长度
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetSignDateTime(unsigned char *puchSignDateTime, int *piSignDateTimeLen);

/**
 * 获取签名算法标识，应标识应遵循国家密码局的相关规定。
 *
 * @param puchSignMethod  [out]     签名算法（UTF-8编码）
 * @param piSignMethodLen [in,out] 签名算法长度
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetSignMethod(unsigned char *puchSignMethod, int *piSignMethodLen);

/**
 * 获取摘要算法标识，该标识应遵循国家密码局的相关要求。
 *
 * @param puchDigestMethod  [out]    摘要算法（UTF-8编码）
 * @param piDigestMethodLen [in,out] 摘要算法长度
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetDigestMethod(unsigned *puchDigestMethod, int *piDigestMethodLen);

/**
 * 代理摘要计算
 *
 * @param puchData          [in]     待摘要的数据
 * @param iDataLen          [in]     待摘要的数据长度
 * @param puchDigestMethod  [in]     摘要算法
 * @param iDigestMethodLen  [in]     摘要算法长度
 * @param puchDigestValue   [out]    摘要值
 * @param piDigestValueLen  [in,out] 摘要值长度
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_Digest(unsigned char *puchData, int iDataLen,
               unsigned char *puchDigestMethod, int iDigestMethodLen,
               unsigned char *puchDigestValue, int *piDigestValueLen);

/**
* 代理计算签名，如果计算前要输入密码，应由组件实现者需要提供输入界面
*
* @param puchSealId        [in]     印章标识
* @param iSealIdLen        [in]     印章标识长度
* @param puchDocProperty   [in]     文档信息，一般为 Signature.xml 的绝对路径
* @param iDocPropertyLen   [in]     文档信息长度
* @param puchDigestData    [in]     摘要数据
* @param iDigestDataLen    [in]     摘要数据长度
* @param puchSignMethod    [in]     签名算法
* @param iSignMethodLen    [in]     签名算法长度
* @param puchSignDataTime  [in]     签名时间
* @param iSignDateTimeLen  [in]     签名时间长度
* @param puchSignValue     [out]    签名值
* @param iSignValueLen     [in,out] 签名值长度
* @return 调用成功返回 OES_OK，否则是错误码。
*/
int OES_Sign(unsigned char *puchSealId, int iSealIdLen,
             unsigned char *puchDocProperty, int iDocPropertyLen,
             unsigned char *puchDigestData, int *iDigestDataLen,
             unsigned char *puchSignMethod, int iSignMethodLen,
             unsigned char *puchSignDataTime, int iSignDateTimeLen,
             unsigned char *puchSignValue, int *iSignValueLen);


/**
* 代理计算签名，如果计算前要输入密码，应由组件实现者需要提供输入界面
*
* @param puchSealData       [in]     印章数据
* @param iSealSealDataLen   [in]     印章数据长度
* @param puchDocProperty    [in]     文档信息
* @param iDocPropertyLen    [in]     文档信息长度
 * @param puchSignMethod    [in]     签名算法
 * @param iSignMethodLen    [in]     签名算法长度
 * @param puchSignDataTime  [in]     签名时间
 * @param iSignDateTimeLen  [in]     签名时间长度
 * @param puchSignValue     [out]    签名值
 * @param iSignValueLen     [in,out] 签名值长度
 * @param iOnline           [in]     是否在线验证
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_Verify(unsigned char *puchSealData, int iSealSealDataLen,
               unsigned char *puchDocProperty, int iDocPropertyLen,
               unsigned char *puchSignMethod, int iSignMethodLen,
               unsigned char *puchSignDataTime, int iSignDateTimeLen,
               unsigned char *puchSignValue, int *iSignValueLen,
               int iOnline);

/**
 * 获取电子签章数据中的图像及其他信息，该接口应在不插入智能密码钥匙时可用。
 *
 * @param puchSignedValueData   [in]     签章数据
 * @param iSignedValueLen       [in]     签章数据长度
 * @param iRenderFlag           [in]     绘制用途标记
 * @param puchSealImage         [out]    印章图像数据
 * @param piSealImageLen        [in,out] 印章图像数据长度
 * @param piSealWidth           [in,out] 印章宽度（单位 mm）
 * @param piSealHeight          [in,out] 印章高度（单位 mm）
 * @return 调用成功返回 OES_OK，否则是错误码。
 */
int OES_GetSignImage(unsigned char *puchSignedValueData, int iSignedValueLen,
                     int iRenderFlag,
                     unsigned char *puchSealImage, int *piSealImageLen,
                     int *piSealWidth, int *piSealHeight);

/**
 * 获取错误信息
 *
 * @param errCode         [in]     错误代码
 * @param puchErrMessage  [out]    错误信息（UTF-8编码）
 * @param piErrMessageLen [in,out] 错误信息长度
 * @return 无
 */
int OES_GetErrMessage(unsigned long errCode,
                      unsigned char *puchErrMessage, int *piErrMessageLen);

#endif //GOES_OES_H
